<?php
/**
 * coreSessionCookie
 *
 * 쿠키를 이용하여 세션데이터를 저장하고 관리합니다.
 * 데이터 저장시 헤더를 써야 하는 문제가 있어 PHP 에서 제공하는 session_set_save_handler 를 정상적으로 활용하지 못함
 * 정확히는 write 메소드가 호출되는 시점이 항상 모든 process가 처리가 된 후 마지막에 호출이 되서 그러함
 *
 * @package core
 * @author  Platform Team
 */

class coreSessionCookie extends coreSessionAbstract
{
    /**
     * INI 설정 - 세션네임
     */
    protected function initSessNameByIni()
    {
        ini_set('session.name', $this->sessNameByCookie);
    }

    /**
     * 초기화
     */
    protected function initialize()
    {
        //Empty
    }

    /**
     * open Handler
     *
     * @return boolean
     */
    public function open($sSavePath, $sSessName)
    {
        //Empty
    }

    /**
     * close Handler
     *
     * @return boolean
     */
    public function close()
    {
        //Empty
    }

    /**
     * read Handler
     *
     * @return string
     */
    public function read($sSessId)
    {
        //Empty
    }

    /**
     * write Handler
     *
     * @return boolean
     */
    public function write($sSessId, $sData)
    {
        //Empty
    }

    /**
     * destroy Handler
     *
     * @return boolean
     */
    public function destroy($sSessId)
    {
        //Empty
    }

    /**
     * garbage collector Handler
     */
    public function gc($iMaxLife)
    {
        //Empty
    }

    /**
     * Session Destroy
     * 쿠키방식은 헤더를 작성해야 하므로 destroy 메소드가 실행되는 시점에 쿠키를 구울 수 없음
     *
     * @return boolean
     */
    public function destruct()
    {
        $sKey = $this->sessName;

        $this->aData = false;

        return setcookie($sKey, '', $this->iNow - $this->sessExpire, '/', $this->sessDomain, false, true);
    }

    /**
     * read Handler 를 대체하는 메소드
     */
    public function individualOpen()
    {
        $sKey = $this->getSessDataKey();

        $sData = $this->loadData($_COOKIE[$sKey]);

        if ($this->sessEncryptHandler == '12r') {
            // 암호화를 하지 않은 데이터의 경우 slash 가 자동으로 붙어서 저장이 되기 때문
            if ($this->sessEncrypt === false) {
                $sData = stripslashes($sData);
            }

            $aData = unserialize($sData);
        } else {
            $aData = $sData;
        }

        if (empty($aData)) {
            return false;
        }

        foreach ($aData as $k => $v) {
            $this->aData[$k] = $v;
        }

        return true;
    }

    /**
     * write Handler 를 대체하는 메소드
     */
    public function individualClose()
    {
        if ($this->getPreventSave()) {
            return;
        }

        $sKey = $this->getSessDataKey();
        $mData = $this->aData;

        if ($this->sessEncryptHandler == '12r') {
            $mData = serialize($mData);
        }

        $sData = $this->saveData($mData);

        if ($sData === false) {
            return false;
        }

        return setcookie($sKey, $sData, 0, '/', $this->sessDomain, false, true);
    }

    /**
     * 세션데이터를 굽는 쿠키키 설정
     */
    private function getSessDataKey()
    {
        return $this->sessName;
    }
}
